/*
 * Created on 28.06.2006.
 */
package esdomaci.gui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import esdomaci.mediator.IMapaVidljivoPlatnu;
import esdomaci.mediator.IAIVidljivoPlatnu;
import esdomaci.mediator.IPlatnoVidljivoSimulatoru;

/**
 * @author Milan Aleksic, milanaleksic@gmail.com
 */
public class Platno extends JPanel implements IPlatnoVidljivoSimulatoru {
    // osnovno...
    private static final long serialVersionUID = 1L;
    private IAIVidljivoPlatnu ai;
    private IMapaVidljivoPlatnu igra;
    
    // boje odaja
    private static final Color BOJA_POZADINE = new Color(200, 200, 100);
    private static final Color BOJA_PREDJENO_ODAJA = new Color(250,250,150);
    private static final Color BOJA_OPASNA_ODAJA = new Color(0xa2,0x31,0);
    private static final Color BOJA_SUMNJIVA_ODAJA = new Color(170, 170, 70);
    private static final Color BOJA_BEZBEDNA_NEOBIDJENA_ODAJA = new Color(220,220,220);
    
    // boje poteza
    private static final Color BOJA_POTEZA = new Color(150, 150, 50);
    private static final Color BOJA_ULP_POTEZA = new Color(200,200,100);
    
    // boje linija
    private static final Color BOJA_SREDNJE_LINIJE = Color.GRAY;
    private static final Color BOJA_RAMA_UNUTARNJA = Color.BLACK;
    private static final Color BOJA_RAMA_SPOLJA = new Color(70, 70, 70);
    
    
    // parametri igre
    private static int xPadding = 30;
    private static int yPadding = 30;
    private static int cellSize = 150;
    
    // slike...
    private ImageIcon kanibalSlika = null;
    private ImageIcon rupaSlika = null;
    private ImageIcon igracSlika = null;
    private ImageIcon zlatoSlika = null;
    
    public Platno(IAIVidljivoPlatnu dedicatedAI, IMapaVidljivoPlatnu igra) {
    	ai = dedicatedAI;
        this.igra = igra;
    }
    
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D rad = (Graphics2D) g;
        
        // koordinatne ose
        rad.setFont(new Font("Arial", Font.BOLD, 11));
        rad.drawString("X", 20, 15);
        rad.drawString("Y", 10, 30);
        for (int i = 0; i<=3; i++) {
            rad.drawString(String.valueOf(i+1), xPadding + cellSize * i + cellSize/2 - 5, 15);
            rad.drawString(String.valueOf(i+1), 10, yPadding + cellSize * i + cellSize/2 - 5);
        }
        
        // razdvojnica osa
        rad.setStroke(new BasicStroke(3.0f));
        rad.setColor(BOJA_RAMA_SPOLJA);
        rad.drawLine(0, 0, xPadding-5, yPadding-5);
        
        // iscrtavanje unutarnjeg dela
        rad.setStroke(new BasicStroke(2.0f));   
        rad.setColor(BOJA_POZADINE);
        rad.fillRect(xPadding, yPadding, 4*cellSize, 4*cellSize);
        
        rad.setStroke(new BasicStroke(1.0f));        
        rad.setColor(BOJA_SREDNJE_LINIJE);        
        for (int i = 1; i<=3; i++) {
            rad.drawLine(xPadding + i*cellSize, yPadding, xPadding + i*cellSize, yPadding+4*cellSize);
            rad.drawLine(xPadding, yPadding + i*cellSize, xPadding+4*cellSize, yPadding + i*cellSize);
        }
        
        //iscrtavanje rama
        rad.setStroke(new BasicStroke(2.0f));
        rad.setColor(BOJA_RAMA_UNUTARNJA);
        rad.drawRect(xPadding, yPadding, 4*cellSize, 4*cellSize);
        rad.setStroke(new BasicStroke(3.0f));
        rad.setColor(BOJA_RAMA_SPOLJA);
        rad.drawRect(xPadding-5, yPadding-5, 10+4*cellSize, 10+4*cellSize);
        
        // prvo iscrtavam rupe pa tek onda iscrtavam ljudozdera jer je to manja slika!
        if (ai.getSpremnoZaRad()) {
            iscrtajPredjeneOdaje(rad);
            iscrtajOdajeSaOpasnostima(rad);
            iscrtajOdajeSaSumnjama(rad);
            iscrtajNeposeceneBezbedneOdaje(rad);
        }
        
        // iscrtavam aktivnu ULP putanju ukoliko je ima
        ArrayList <Point> aiULP = ai.getULP();
        if (aiULP.size() >= 1) {
            rad.setStroke(new BasicStroke(4.0f));
            rad.setColor(BOJA_ULP_POTEZA);
            Iterator<Point> iter = aiULP.iterator();
            Point prvi= ai.getIgrac(), drugi = iter.next();
            while (true) {
                rad.drawLine(xPadding + prvi.x * cellSize + cellSize / 2,
                        xPadding + prvi.y * cellSize + cellSize / 2,
                        xPadding + drugi.x * cellSize + cellSize / 2,
                        xPadding + drugi.y * cellSize + cellSize / 2);
                if (!iter.hasNext())
                    break;
                prvi = drugi;
                drugi = iter.next();
            }
            
        }

        
        
        
        // iscrtavam liniju koja opisuje pomeraj ukoliko je doslo do njega
        if (ai.getStariIgrac() != null) {
            rad.setStroke(new BasicStroke(4.0f));
            rad.setColor(BOJA_POTEZA);
            rad.drawLine(xPadding + ai.getStariIgrac().x * cellSize + cellSize / 2,
                    xPadding + ai.getStariIgrac().y * cellSize + cellSize / 2,
                    xPadding + ai.getIgrac().x * cellSize + cellSize / 2,
                    xPadding + ai.getIgrac().y * cellSize + cellSize / 2);
        }
        
        if (ai.getSpremnoZaRad())
	        iscrtajSpecijalneLokacije(rad);


    }
    
    /**
     * Iscrtavanje svih odaja koje su bezbedne a jos nisu predjene
     */
    public void iscrtajNeposeceneBezbedneOdaje(Graphics2D platno) {
    	platno.setColor(BOJA_BEZBEDNA_NEOBIDJENA_ODAJA);
        ArrayList<Point> lista = igra.vratiBezbedneNePoseceneOdaje();
        for (Point tmp : lista)
        	platno.fillRect(xPadding + tmp.x * cellSize + 1,
                    yPadding + tmp.y * cellSize + 1,
                    cellSize - 1,
                    cellSize - 1);
    }
    
    /**
     * Iscrtavanje svih odaja koje su predjene u dosadasnjem lutanju
     */
    public void iscrtajPredjeneOdaje(Graphics2D platno) {
    	platno.setColor(BOJA_PREDJENO_ODAJA);
    	ArrayList<Point> lista = igra.vratiPoseceneOdaje();
    	for (Point tmp : lista)            
            platno.fillRect(xPadding + tmp.x * cellSize + 1,
                    yPadding + tmp.y * cellSize + 1,
                    cellSize - 1,
                    cellSize - 1);
    }
    
    /**
     * Iscrtavanje svih odaja koje imaju prepoznate opasnosti
     */
    public void iscrtajOdajeSaOpasnostima(Graphics2D platno) {
        platno.setColor(BOJA_OPASNA_ODAJA);
    	ArrayList<Point> lista = igra.vratiFiksneOpasneOdaje();
    	for (Point tmp : lista)            
            platno.fillRect(xPadding + tmp.x * cellSize + 1,
                    yPadding + tmp.y * cellSize + 1,
                    cellSize - 1,
                    cellSize - 1);
    }
    
    /**
     * Iscrtavanje svih odaja koje imaju prepoznate opasnosti
     */
    public void iscrtajOdajeSaSumnjama(Graphics2D platno) {
    	platno.setColor(BOJA_SUMNJIVA_ODAJA);
    	ArrayList<Point> lista = igra.vratiSumnjiveOdaje();
        for (Point tmp : lista)            
            platno.fillRect(xPadding + tmp.x * cellSize + 1,
                    yPadding + tmp.y * cellSize + 1,
                    cellSize - 1,
                    cellSize - 1);
    }
    
    /**
     * Iscrtavanje svih objekata na platnu
     * @param platno Platno na kojem ce se vrsiti iscrtavanje
     */
    private void iscrtajSpecijalneLokacije(Graphics2D platno) {
//      ******************** RUPE
        int bafer = (cellSize - rupaSlika.getImage().getWidth(this)) / 2;
        platno.drawImage( rupaSlika.getImage(), 
                xPadding + igra.getRupa1().x * cellSize + bafer, 
                yPadding + igra.getRupa1().y * cellSize + bafer, 
                this);
        platno.drawImage(rupaSlika.getImage(), 
                xPadding + igra.getRupa2().x * cellSize + bafer, 
                yPadding + igra.getRupa2().y * cellSize + bafer, 
                this);
//      ******************** KANIBAL
        bafer = (cellSize - kanibalSlika.getImage().getWidth(this)) / 2;
        platno.drawImage(kanibalSlika.getImage(), 
                xPadding + igra.getKanibal().x * cellSize + bafer, 
                yPadding + igra.getKanibal().y * cellSize + bafer, 
                this);
//      ******************** ZLATO
        bafer = (cellSize - zlatoSlika.getImage().getWidth(this)) / 2;
        platno.drawImage(zlatoSlika.getImage(), 
                xPadding + igra.getZlato().x * cellSize + bafer, 
                yPadding + igra.getZlato().y * cellSize + bafer, 
                this);
//      ******************** igrac
        bafer = (cellSize - igracSlika.getImage().getWidth(this)) / 2;
        platno.setColor(BOJA_PREDJENO_ODAJA);
        platno.drawImage(igracSlika.getImage(), 
                xPadding + ai.getIgrac().x * cellSize + bafer, 
                yPadding + ai.getIgrac().y * cellSize + bafer, 
                this);
    }
    
    public void setSlike(ImageIcon kanibalSlika, 
    		ImageIcon rupaSlika, ImageIcon igracSlika, ImageIcon zlatoSlika) {
        this.kanibalSlika = kanibalSlika;
        this.rupaSlika = rupaSlika;
        this.igracSlika = igracSlika;
        this.zlatoSlika = zlatoSlika;
    }
}